370 IF VF THEN VM = INT(3000/VF):DB = 1: DIM DB$(VM,VF)
380 RETURN
390 REM <CTRL-J>CHANGE DATA IN MEMORY<CTRL-J>
400 IF VF = 0 GOTO 3430
410 IF VR = 0 GOTO 3490
420 GOSUB 3110: GOSUB 3160
430 PRINT : INPUT "LOOK FOR WHAT VALUE? :";T1$
440 PRINT : INPUT "CHANGE IT INTO WHAT? :";T2$
450 J = 0: FOR I = VL TO VH: IF DB$(I,F) = T1$ THEN DB$(I,F) = T2$: PRINT " "I;:J = 1
460 NEXT : IF J THEN PRINT " CHANGED.": RETURN
470 GOTO 3270
480 REM <CTRL-J>DELETE RECORDS<CTRL-J>
490 PRINT "(I WILL ASK FOR PERMISSION TO DELETE.)": PRINT
500 IF VF = 0 GOTO 3430
510 IF VR = 0 GOTO 3490
520 GOSUB 3160
530 INPUT "TO DELETE THEM, TYPE 'YES':";T$: IF T$ < >"YES" GOTO 3090
540 IF VH <VR THEN D = VH +1 -VL: FOR I = VH +1 TO VR: FOR J = 1 TO VF:DB$(I -D,J) = DB$(I,J): NEXT J,I
550 VR = VR -VH +VL -1: GOTO 3250
560 REM <CTRL-J>EXPORT A RANDOM FILE<CTRL-J>
570 IF VF = 0 GOTO 3430
580 IF VR = 0 GOTO 3490
590 PRINT "I CAN CREATE A RANDOM-ACCESS FILE": PRINT "FROM THE "VR" RECORDS NOW IN MEMORY.": PRINT : PRINT "IS THIS WHAT YOU WANT? ";: GOSUB 3350: IF N THEN RETURN
600 PRINT : PRINT "THE RECORD LENGTH MUST BE AT LEAST": PRINT "... JUST A MOMENT"
610 L = 0: FOR I = 1 TO VR:Z = VF: FOR J = 1 TO VF:Z = Z + LEN(DB$(I,J)): NEXT : IF L <Z THEN L = Z
620 NEXT : GOSUB 3380: GOSUB 3420: PRINT L" BYTES TO HOLD ALL THE DATA."
630 PRINT : INPUT "WHAT RECORD LENGTH DO YOU WANT? ";W: IF W <L THEN PRINT "THAT WOULD NOT WORK!": RETURN
640 PRINT "ENTER FILE-NAME TO CREATE:"
650 INPUT " ";FR$: IF FR$ = FI$ THEN PRINT "NO, I WON'T OVERWRITE THAT!": RETURN
660 IF FR$ = "" OR FR$ = "?" THEN PRINT D$"CAT": GOTO 640
665 FOR J = 1 TO VF:DB$(0,J) = "": NEXT :DB$(0,1) = STR$(VR)
670 PRINT D$"OPEN"FR$",L"W
673 FOR I = 0 TO VR: PRINT D$"WRITE"FR$",R"I: PRINT SPC( W)"": PRINT D$"WRITE"FR$",R"I: FOR J = 1 TO VF: PRINT DB$(I,J): NEXT : NEXT : PRINT D$"CLOSE"FR$
680 PRINT VR" RECORDS WRITTEN.": RETURN
690 REM <CTRL-J>FIND DATA IN MEMORY<CTRL-J>
700 IF VF = 0 GOTO 3430
710 IF VR = 0 GOTO 3490
720 GOSUB 3110: GOSUB 3160
730 PRINT : INPUT "LOOK FOR WHAT VALUE? :";T1$:T1 = LEN(T1$): IF T1 = 0 THEN T1 = 1
740 PRINT "FOUND IN";:C = 0
750 FOR I = VL TO VH:DB$(I,0) = "N"
760 IF LEFT$(DB$(I,F),T1) = T1$ THEN :DB$(I,0) = "Y": PRINT " "I;:C = C +1
770 NEXT : IF C = 0 THEN PRINT " ... NONE!": RETURN
780 PRINT ".": PRINT : PRINT "ENTER AN ACTION FOR THESE RECORDS:": PRINT
790 PRINT " C - CHANGE '"T1$"'.": PRINT " D - DELETE THEM."
800 PRINT " L - LIST THEM": PRINT " U - UPDATE THEM"
810 PRINT : PRINT "ACTION: ";: GET C$: PRINT C$: IF C$ < >CR$ THEN PRINT
1740 PRINT VF: PRINT FM: FOR J = 1 TO VF: PRINT FT$(J): NEXT
1750 PRINT VM: PRINT VR: FOR I = 1 TO VR: FOR J = 1 TO VF: PRINT DB$(I,J): NEXT : NEXT
1760 PRINT D$"CLOSE"FI$: PRINT : PRINT VR" RECORDS WRITTEN.": RETURN
1770 REM <CTRL-J>QUIT<CTRL-J>
1780 IF VR THEN PRINT "TO END GRACEFULLY, USE THE 'Z' COMMAND. ": GOTO 3450
1790 PRINT "DATA BASE - END OF RUN."
1800 TEXT : GOSUB 3370: POKE 216,0: END
1810 REM <CTRL-J>REPORT ON DATA BASE<CTRL-J>
1820 IF VF = 0 GOTO 3430
1830 IF VR = 0 GOTO 3490
1840 IF RG THEN PRINT "SAME FORMAT AS THE PREVIOUS REPORT? ";: GOSUB 3350: IF (Y) THEN INVERSE : PRINT RIGHT$(" " + STR$(J),2);: NORMAL : PRINT FT$(J): NEXT : GOTO 2050
1850 Z = RS: IF Z = 0 THEN INPUT "PRINTER SLOT: ";Z: IF Z <1 OR Z >7 THEN RETURN
1860 RS = Z:Z = RW: IF Z = 0 THEN INPUT "PAPER WIDTH: ";Z: IF Z <20 THEN RETURN
1870 RW = Z:Z = RD: IF Z = 0 THEN INPUT "PAPER DEPTH: ";Z: IF Z <20 THEN RETURN
1880 RD = Z: HOME : INVERSE : PRINT " FIELD-NAME PRINT WIDTH # DEC": NORMAL
1890 Z = INT((RW -VF)/VF): FOR J = 1 TO VF: VTAB 4 +J: INVERSE : PRINT RIGHT$(" " + STR$(J),2);: NORMAL : PRINT LEFT$(FT$(J),15) TAB( 18)"Y" TAB( 25)Z TAB( 34)"A":FW%(J) = Z:FD%(J) = -1: NEXT
1900 VTAB 6 +VF: GOSUB 3390:VO = 0: PRINT "ARE SOME FIELDS TO BE OMITTED? ";: GOSUB 3350: IF N GOTO 1960
1910 VTAB 6 +VF: GOSUB 3390: PRINT "TYPE 'N' TO OMIT; 'Y' TO PRINT."
1920 FOR J = 1 TO VF: VTAB 4 +J: HTAB 18: GOSUB 3350: IF N THEN FW%(J) = 0:VO = VO +1: GOSUB 3380: HTAB 24: GOSUB 3420
1930 NEXT : PRINT : IF VO = VF THEN RETURN
1940 IF VO THEN Z = VF -VO:Z = INT((RW -Z)/Z): FOR J = 1 TO VF: IF FW%(J) THEN VTAB 4 +J: HTAB 25: PRINT Z:FW%(J) = Z
1950 NEXT
1960 VTAB 6 +VF: GOSUB 3390: PRINT "WILL YOU ENTER FIELD-WIDTHS? ";: GOSUB 3350: IF N GOTO 2020
1970 VTAB 6 +VF: GOSUB 3390: PRINT "ENTER WIDTH FOR EACH FIELD.": PRINT "DON'T USE MORE THAN "RW -VF +VO +1" COLUMNS. ":Z = 0
1980 FOR J = 1 TO VF: IF FW%(J) = 0 GOTO 2010
1990 VTAB 4 +J: HTAB 25: INPUT "";Z$:I = VAL(Z$): IF I >0 THEN FW%(J) = I
2010 Z = Z +FW%(J): NEXT : IF Z >RW -VF +VO +1 THEN VTAB 7 +VF: INVERSE : PRINT "THAT'S MORE COLUMNS THAN FIT THE PAPER!";: GET Z$: NORMAL : PRINT : GOTO 1970
2020 VTAB 6 +VF: GOSUB 3390: PRINT "ENTER # OF DECIMALS FOR NUMERIC FIELDS.": PRINT "LEAVE THE 'A' THERE FOR ALPHANUMERIC."
2030 FOR J = 1 TO VF:I = FW%(J): IF I THEN VTAB 4 +J: HTAB 34: GET Z$: IF Z$ > = "0" AND Z$ <"7" THEN Z = VAL(Z$): IF Z <I THEN PRINT Z:FD%(J) = Z
2040 NEXT : PRINT
2050 VTAB 6 +VF: GOSUB 3390: PRINT "PRINT ";: INVERSE : PRINT "ALL";: NORMAL : PRINT " OR ";: INVERSE : PRINT "SELECTED";: NORMAL : PRINT " RECORDS? (A / S): ";
2060 GET Z$: IF Z$ < >"A" AND Z$ < >"S" GOTO 2060
2070 PRINT Z$:RC = Z$ = "S": IF RC = 0 GOTO 2110
2080 PRINT "SELECT BASED ON WHICH FIELD? (1-"VF;: INPUT "): ";Z$
2090 RC = VAL(Z$): IF RC <1 OR RC >VF GOTO 2050
2100 VTAB 6 +VF: GOSUB 3390: PRINT "ENTER MIN & MAX FOR '"FT$(RC)"'.": INPUT "MINIMUM: ";RL$:RL = VAL(RL$): INPUT "MAXIMUM: ";RH$:RH = VAL(RH$)
2110 VTAB 6 +VF: GOSUB 3390: PRINT "ENTER REPORT TITLE. I WILL CENTRE IT.": INPUT "";RT$
2120 Z = 0:I = 0: FOR J = 1 TO VF:FT(J) = 0:X = FW%(J):I = I + SGN(X):Z = Z +X: NEXT :RG = 1: IF I >1 THEN RG = INT((RW -Z)/(I -1))
2130 VTAB 6 +VF: GOSUB 3390: PRINT "PRESS ANY KEY TO PRINT, 'ESC' TO QUIT. ";
2140 GET Z$: IF Z$ = CHR$(27) THEN RETURN
2150 PRINT : PRINT D$"PR#"RS:RP = 0:RL = RD: FOR I = 1 TO VR: IF RC = 0 GOTO 2200
2160 IF FD%(RC) <0 GOTO 2190
2170 Z = VAL(DB$(I,RC)): IF Z <RL OR Z >RH GOTO 2370
2180 GOTO 2200
2190 Z$ = DB$(I,RC): IF Z$ <RL$ OR Z$ >RH$ GOTO 2370
2200 IF RL +9 <RD GOTO 2290
2210 IF RL <RD THEN PRINT :RL = RL +1: GOTO 2210
2220 RP = RP +1:Z = (RW - LEN(RT$))/2: IF Z > = 1 THEN PRINT SPC( Z);
2230 PRINT RT$: PRINT "FILE: "FI$;:Z = RW -13 - LEN(FI$): IF Z > = 1 THEN PRINT SPC( Z);
2240 PRINT "PAGE "RP: PRINT :X = 0: FOR J = 1 TO VF:Z = FW%(J): IF Z = 0 GOTO 2280
2250 IF X THEN PRINT SPC( RG)
2260 X = 1: IF FD%(J) <0 THEN PRINT LEFT$(FT$(J) +BL$,Z);: GOTO 2280
2270 PRINT RIGHT$(BL$ + LEFT$(FT$(J),Z),Z);
2280 NEXT : PRINT :RL = 5: PRINT
2290 PRINT :X = 0: FOR J = 1 TO VF:Z = FW%(J): IF Z = 0 GOTO 2360
2300 IF X THEN PRINT SPC( RG)
2310 X = 1:D = FD%(J): IF D <0 THEN PRINT LEFT$(DB$(I,J) +BL$,Z);: GOTO 2360